﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;

namespace QL_Nha_Sach_Phuong_Nam
{
    class CDuLieu
    {
        private static CDuLieu m_data = null;
        private DataDataContext m_ds;
        private CDuLieu()
        {
            string strCon = @"Data Source=THANHVY-PC\SQLEXPRESS;Initial Catalog=NhaSachPhuongNam;Integrated Security=True";
            m_ds = new DataDataContext(strCon);
        }
        public static CDuLieu khoitao()
        {
            if (m_data == null) m_data = new CDuLieu();
            return m_data;
        }

        /// <summary>
        /// Get Du Lieu
        /// </summary>
        /// <returns></returns>
        /// 

        #region Các hàm xử lý của tác giả

        //Tra ve ds tac gia
        public List<TacGia> getdsTacGia()
        {
            return m_ds.TacGias.ToList();
        }

        //tim tac gia theo ma
        private TacGia TimTacGiama(string matg)
        {
            TacGia tg = null;
            var kq = m_ds.TacGias.Where(x => x.TacGiaNo == matg);
            if (kq.Count() > 0)
                tg = kq.First();
            return tg;
        }

        //Them tac gia
        public void ThemTacgia(TacGia tg)
        {
            m_ds.TacGias.InsertOnSubmit(tg);
            updateDulieu();
        }

        //Xoa tac gia
        public void XoaTacgia(string ma)
        {
            TacGia tg = m_ds.TacGias.Where(x=>x.TacGiaNo==ma).First();
            if (tg != null)
            {
                tg.TacGiaStatus = "delete";
                updateDulieu();
            }
        }

        //Sua tac gia
        public void SuaTacgia(TacGia tg)
        {
            TacGia edittg = m_ds.TacGias.Where(x => x.TacGiaNo == tg.TacGiaNo).First();
            if (edittg != null)
            {
                edittg.TacGiaName = tg.TacGiaName;
                edittg.TacGiaSex = tg.TacGiaSex;
                edittg.TacGiaAddress = tg.TacGiaAddress;
                edittg.TacGiaPhoneNumber = tg.TacGiaPhoneNumber;
                edittg.TacGiaDescription = tg.TacGiaDescription;
                updateDulieu();
            }
        }

        #endregion

        #region Các hàm xử lý của thể loại

        //Lay ds the loai
        public List<TheLoai> getdsTheLoai()
        {
            return m_ds.TheLoais.ToList();
        }

        //tim the loai theo ma
        private TheLoai TimTheLoaima(string matl)
        {
            TheLoai tl =null;
            var kq = m_ds.TheLoais.Where(x => x.TheLoaiNo == matl);
            if (kq.Count() > 0)
                tl = kq.First();
            return tl;
        }

        //Them the loai
        public void ThemTheLoai(TheLoai tl)
        {
            m_ds.TheLoais.InsertOnSubmit(tl);
            updateDulieu();
        }

        //Xoa the loai
        public void XoaTheLoai(string tentl)
        {
            TheLoai tl = m_ds.TheLoais.Where(x => x.TheLoaiName == tentl).First();
            if (tl != null)
            {
                tl.TheLoaiStatus = "delete";
            }
            updateDulieu();
        }

        //Sua the loai
        public void SuaTheLoai(TheLoai tl)
        {
            TheLoai tledit = m_ds.TheLoais.Where(x => x.TheLoaiNo == tl.TheLoaiNo).First();
            if (tledit != null)
            {
                tledit.TheLoaiNo = tl.TheLoaiNo;
                tledit.TheLoaiName = tl.TheLoaiName;
                tledit.TheLoaiDescription = tl.TheLoaiDescription;
            }
            updateDulieu();
        }

        #endregion

        #region Các hàm xử lý của thông tin sách
        
        //Lay danh sach Sach
        public List<Sach> getdsSach()
        {
            return m_ds.Saches.ToList();
        }

        //tim theo ma sach
        private Sach TimSachtheoma(string ma)
        {
            Sach sach = null;
            var kq = m_ds.Saches.Where(x => x.SachNo == ma);
            if (kq.Count() > 0)
            {
                sach = kq.First();
            }
            return sach;
        }

        //Tim sach theo Id
        private Sach TimSachtheoId(int id)
        {
            Sach sach = null;
            var kq = m_ds.Saches.Where(x => x.SachID == id);
            if (kq.Count() > 0)
            {
                sach = kq.First();
            }
            return sach;
        }

        //them sach
        public void ThemSach(Sach sach)
        {
            m_ds.Saches.InsertOnSubmit(sach);
            foreach (Sach_TacGia stg in sach.Sach_TacGias)
            {
                m_ds.Sach_TacGias.InsertOnSubmit(stg);
            }
            foreach (Sach_TheLoai stl in sach.Sach_TheLoais)
            {
                m_ds.Sach_TheLoais.InsertOnSubmit(stl);
            }
            updateDulieu();
        }

        //xoa sach
        public void XoaSach(string ma)
        {
            Sach sach = TimSachtheoma(ma);
            if (sach != null)
            {
                sach.SachStatus = "delete";
                updateDulieu();
            }
        }


        //sua sach
        public void SuaSach(Sach sach, string manxb)
        {
            Sach editSach = TimSachtheoId(sach.SachID);
            NhaXuatBan nxb = TimNhaXuatBanma(manxb);
            if (sach != null && nxb != null)
            {
                foreach (Sach_TacGia stg in editSach.Sach_TacGias)
                {
                    m_ds.Sach_TacGias.DeleteOnSubmit(stg);
                }
                foreach (Sach_TheLoai stl in editSach.Sach_TheLoais)
                {
                    m_ds.Sach_TheLoais.DeleteOnSubmit(stl);
                }
                updateDulieu();
                editSach.SachNo = sach.SachNo;
                editSach.SachName = sach.SachName;
                editSach.SachNamXuatBan = sach.SachNamXuatBan;
                editSach.SachPrice = sach.SachPrice;
                editSach.SachDescription = sach.SachDescription;
                editSach.NhaXuatBan = nxb;
                foreach (Sach_TacGia stg1 in sach.Sach_TacGias)
                {
                    Sach_TacGia test = new Sach_TacGia();
                    test.Sach_TacGiaDescription = stg1.Sach_TacGiaDescription;
                    test.TacGia = TimTacGiama(stg1.TacGia.TacGiaNo);
                    test.Sach = editSach;
                    m_ds.Sach_TacGias.InsertOnSubmit(test);
                }
                foreach (Sach_TheLoai stl1 in sach.Sach_TheLoais)
                {
                    Sach_TheLoai test2 = new Sach_TheLoai();
                    test2.Sach_TheLoaiDescription = stl1.Sach_TheLoaiDescription;
                    test2.TheLoai = TimTheLoaima(stl1.TheLoai.TheLoaiNo);
                    test2.Sach = editSach;
                    m_ds.Sach_TheLoais.InsertOnSubmit(test2);
                }
                updateDulieu();
            }
        }

        #endregion

        #region Các hàm xử lý của nhà xuất bản
        
        //Lay danh sach NXB
        public List<NhaXuatBan> getdsNXB()
        {
            return m_ds.NhaXuatBans.ToList();
        }

        //tim nha xuat ban theo ma
        private NhaXuatBan TimNhaXuatBanma(string manhaXuatBan)
        {
            NhaXuatBan nxb = null;
            var kq = m_ds.NhaXuatBans.Where(x => x.NhaXuatBanNo == manhaXuatBan);
            if (kq.Count() > 0)
                nxb = kq.First();
            return nxb;
        }

        //Them nha xuat ban
        public void ThemNhaXuatBan(NhaXuatBan nxb)
        {
            m_ds.NhaXuatBans.InsertOnSubmit(nxb);
            updateDulieu();
        }

        //Xoa nha xuat ban
        public void XoaNhaXuatBan(string manxb)
        {
            NhaXuatBan editnxb = TimNhaXuatBanma(manxb);
            if (editnxb != null)
            {
                editnxb.NhaXuatBanStatus = "delete";
                updateDulieu();
            }

        }

        //Sua nha xuat ban
        public void SuaNhaXuatBan(NhaXuatBan nxb)
        {
            NhaXuatBan editnxb = TimNhaXuatBanma(nxb.NhaXuatBanNo);
            if (editnxb != null)
            {
                editnxb.NhaXuatBanName = nxb.NhaXuatBanName;
                editnxb.NhaXuatBanAddress = nxb.NhaXuatBanAddress;
                editnxb.NhaXuatBanPhoneNumber = nxb.NhaXuatBanPhoneNumber;
                editnxb.NhaXuatBanEmail = nxb.NhaXuatBanEmail;
                editnxb.NhaXuatBanDescription = nxb.NhaXuatBanDescription;
                updateDulieu();
            }
        }

        #endregion

        #region Các hàm xử lý phiếu đặt

        //lay danh sach phieu dat
        public List<PhieuDat> getListPhieuDat()
        {
            return m_ds.PhieuDats.ToList();
        }

        //tim phieu dat
        public PhieuDat TimPhieuDat(string maphieudat)
        {
            PhieuDat pd=null;
            var kq = m_ds.PhieuDats.Where(x => x.PhieuDatNo == maphieudat);
            if (kq.Count()>0)
                pd = kq.First();
            return pd;
        }
        
        //them phieu dat
        public void ThemPhieuDat(PhieuDat pd)
        {
            m_ds.PhieuDats.InsertOnSubmit(pd);
            updateDulieu();
        }

        //xoa phieu dat
        public void XoaPhieuDat(string maphieudat)
        {
            PhieuDat pd = TimPhieuDat(maphieudat);
            if (pd != null)
            {
                pd.PhieuDatStatus = "delete";
                updateDulieu();
            }
        }

        //sua phieu dat
        public void SuaPhieuDat(PhieuDat pd)
        {
            PhieuDat editpd = TimPhieuDat(pd.PhieuDatNo);
            if (editpd != null)
            {
                //delete luôn chi tiết phiếu
                foreach (ChiTietPhieuDat ctpd in editpd.ChiTietPhieuDats)
                {
                    m_ds.ChiTietPhieuDats.DeleteOnSubmit(ctpd);
                }
                updateDulieu();

                editpd.PhieuDatNo = pd.PhieuDatNo;
                editpd.PhieuDatPayment = pd.PhieuDatPayment;
                editpd.PhieuDatDate = pd.PhieuDatDate;
                editpd.PhieuDatDeliveTime = pd.PhieuDatDeliveTime;
                
                //Them lai chi tiet phieu
                foreach (ChiTietPhieuDat ctpd in pd.ChiTietPhieuDats)
                {
                    ChiTietPhieuDat ct = new ChiTietPhieuDat();
                    ct.Sach=TimSachtheoId(ctpd.FK_SachID);
                    ct.PhieuDat = TimPhieuDat(ctpd.PhieuDat.PhieuDatNo);
                    ct.ChiTietPhieuDatQuantum = ctpd.ChiTietPhieuDatQuantum;
                    ct.ChiTietPhieuDatPrice = ctpd.ChiTietPhieuDatPrice;
                    ct.ChiTietPhieuDatTotal = ctpd.ChiTietPhieuDatTotal;
                    m_ds.ChiTietPhieuDats.InsertOnSubmit(ct);
                }
                updateDulieu();
            }
        }

        //sua trang thai xu ly cua phieu dat
        public void SuaTrangThaiXuLyPhieuDat(string maphieudat)
        {
            PhieuDat pd = TimPhieuDat(maphieudat);
            if (pd != null)
            {
                pd.PhieuDatHandle = "yes";
                updateDulieu();
            }
        }

        //sua complete của phieu dat
        public void SuaCompleteCuaPhieuDat(string maphieudat)
        {
            PhieuDat pd = TimPhieuDat(maphieudat);
            if (pd != null)
            {
                pd.PhieuDatComplete = "yes";
                updateDulieu();
            }
        }

        //them chi tiet phieu dat
        public void ThemChitietPhieuDat(PhieuDat pd)
        {
            foreach (ChiTietPhieuDat ctpd in pd.ChiTietPhieuDats)
            {
                m_ds.ChiTietPhieuDats.InsertOnSubmit(ctpd);
                updateDulieu();
            }
        }

        #endregion

        #region Các hàm xử lý của phiếu nhập

        //lay danh sach phieu nhap
        public List<PhieuNhap> getListPhieuNhap()
        {
            return m_ds.PhieuNhaps.ToList();
        }

        //lay danh sach chi tiet phieu nhap
        public List<ChiTietPhieuNhap> getListChiTietPhieuNhap()
        {
            return m_ds.ChiTietPhieuNhaps.ToList<ChiTietPhieuNhap>();
        }

        //tim phieu dat
        public PhieuNhap TimPhieuNhap(string maphieunhap)
        {
            PhieuNhap pn = null;
            var kq = m_ds.PhieuNhaps.Where(x => x.PhieuNhapNo == maphieunhap);
            if (kq.Count() > 0)
                pn = kq.First();
            return pn;
        }

        //them phieu nhap
        public void ThemPhieuNhap(PhieuNhap pn)
        {
            m_ds.PhieuNhaps.InsertOnSubmit(pn);
            updateDulieu();
        }

        //xoa phieu nhap
        public void XoaPhieuNhap(string maphieunhap)
        {
            PhieuNhap pd = TimPhieuNhap(maphieunhap);
            if (pd != null)
            {
                pd.PhieuNhapStatus = "delete";
                updateDulieu();
            }
        }

        //sua phieu nhap
        public void SuaPhieuNhap(PhieuNhap pd)
        {
            PhieuNhap editpd = TimPhieuNhap(pd.PhieuNhapNo);
            if (editpd != null)
            {
                //delete luôn chi tiết phiếu
                foreach (ChiTietPhieuNhap ctpd in editpd.ChiTietPhieuNhaps)
                {
                    m_ds.ChiTietPhieuNhaps.DeleteOnSubmit(ctpd);
                }
                updateDulieu();

                editpd.PhieuNhapNo = pd.PhieuNhapNo;
                editpd.PhieuNhapDate = pd.PhieuNhapDate;

                //Them lai chi tiet phieu
                foreach (ChiTietPhieuNhap ctpd in pd.ChiTietPhieuNhaps)
                {
                    ChiTietPhieuNhap ct = new ChiTietPhieuNhap();
                    ct.Sach = TimSachtheoId(ctpd.FK_SachID);
                    ct.PhieuNhap = TimPhieuNhap(ctpd.PhieuNhap.PhieuNhapNo);
                    ct.ChiTietPhieuNhapQuantum = ctpd.ChiTietPhieuNhapQuantum;
                    ct.ChiTietPhieuNhapPrice = ctpd.ChiTietPhieuNhapPrice;
                    ct.ChiTietPhieuNhapTotal = ctpd.ChiTietPhieuNhapTotal;
                    m_ds.ChiTietPhieuNhaps.InsertOnSubmit(ct);
                }
                updateDulieu();
            }
        }

        //Sua trang thai xu ly phieu nhap
        public void SuaTrangThaiXuLyPhieuNhap(string ma)
        {
            PhieuNhap pd = TimPhieuNhap(ma);
            if (pd != null)
            {
                pd.PhieuNhapHandle = "yes";
                updateDulieu();
            }
        }
        #endregion

        #region Các hàm xử lý phiếu đề nghị xuất kho
        //lay danh sach phieu de nghi xuat
        public List<PhieuDeNghiXuatKho> getListDeNghiXuat()
        {
            return m_ds.PhieuDeNghiXuatKhos.ToList();
        }

        //tim phieu phieu de nghi xuat
        public PhieuDeNghiXuatKho TimPhieuDeNghiXuatKho(string maphieu)
        {
            PhieuDeNghiXuatKho pn = null;
            var kq = m_ds.PhieuDeNghiXuatKhos.Where(x => x.PhieuDeNghiXuatKhoNo == maphieu);
            if (kq.Count() > 0)
                pn = kq.First();
            return pn;
        }

        //them phieu de nghi xuat
        public void ThemPhieuDeNghiXuatKho(PhieuDeNghiXuatKho pn)
        {
            m_ds.PhieuDeNghiXuatKhos.InsertOnSubmit(pn);
            updateDulieu();
        }

        //xoa phieu de nghi xuat
        public void XoaPhieuDeNghiXuatKho(string maphieu)
        {
            PhieuDeNghiXuatKho pd = TimPhieuDeNghiXuatKho(maphieu);
            if (pd != null)
            {
                pd.PhieuDeNghiXuatKhoStatus = "delete";
                updateDulieu();
            }
        }

        //sua phieu de nghi xuat
        public void SuaPhieuDeNghiXuat(PhieuDeNghiXuatKho pd)
        {
            PhieuDeNghiXuatKho editpd = TimPhieuDeNghiXuatKho(pd.PhieuDeNghiXuatKhoNo);
            if (editpd != null)
            {
                //delete luôn chi tiết phiếu
                foreach (ChiTietPhieuDeNghiXuatKho ctpd in editpd.ChiTietPhieuDeNghiXuatKhos)
                {
                    m_ds.ChiTietPhieuDeNghiXuatKhos.DeleteOnSubmit(ctpd);
                }
                updateDulieu();

                editpd.PhieuDeNghiXuatKhoNo = pd.PhieuDeNghiXuatKhoNo;
                editpd.PhieuDeNghiXuatKhoDate = pd.PhieuDeNghiXuatKhoDate;

                //Them lai chi tiet phieu
                foreach (ChiTietPhieuDeNghiXuatKho ctpd in pd.ChiTietPhieuDeNghiXuatKhos)
                {
                    ChiTietPhieuDeNghiXuatKho ct = new ChiTietPhieuDeNghiXuatKho();
                    ct.Sach = TimSachtheoId(ctpd.FK_SachID);
                    ct.PhieuDeNghiXuatKho = TimPhieuDeNghiXuatKho(ctpd.PhieuDeNghiXuatKho.PhieuDeNghiXuatKhoNo);
                    ct.Quantum = ctpd.Quantum;
                    m_ds.ChiTietPhieuDeNghiXuatKhos.InsertOnSubmit(ct);
                }
                updateDulieu();
            }
        }

        //get danh sach ton kho
        public List<TonKho> getListTonKho()
        {
            return m_ds.TonKhos.ToList();
        }

        //Sửa trạng thái xửa lý của phiếu đề nghị xuất kho
        public void SuaTrangThaiXuLyPhieuDeNghiXuatKho(PhieuDeNghiXuatKho pd)
        {
            PhieuDeNghiXuatKho editpd = TimPhieuDeNghiXuatKho(pd.PhieuDeNghiXuatKhoNo);
            if (editpd != null)
            {
                editpd.PhieuDeNghiXuatKhoHandle = pd.PhieuDeNghiXuatKhoHandle;
                updateDulieu();
            }
        }

        //Sửa Complete cho phiếu đề nghị xuất kho
        public void SuaCompletePhieuDeNghiXuatKho(string maphieu)
        {
            PhieuDeNghiXuatKho pd = TimPhieuDeNghiXuatKho(maphieu);
            if (pd != null)
            {
                pd.PhieuDeNghiXuatKhoComplete = "yes";
                updateDulieu();
            }
        }
        #endregion

        #region Các hàm xử lý phiếu xuất kho

        //lay danh sach phieu xuat
        public List<PhieuXuat> getListPhieuXuat()
        {
            return m_ds.PhieuXuats.ToList();
        }

        //lay danh sach chi tiet phieu xuat
        public List<ChiTietPhieuXuat> getListChiTietPhieuXuat()
        {
            return m_ds.ChiTietPhieuXuats.ToList();
        }

        //tim phieu xuat
        public PhieuXuat TimPhieuXuat(string maphieu)
        {
            PhieuXuat pn = null;
            var kq = m_ds.PhieuXuats.Where(x => x.PhieuXuatNo == maphieu);
            if (kq.Count() > 0)
                pn = kq.First();
            return pn;
        }

        //them phieu xuat
        public void ThemPhieuXuat(PhieuXuat pn)
        {
            m_ds.PhieuXuats.InsertOnSubmit(pn);
            updateDulieu();
        }

        //xoa phieu xuat
        public void XoaPhieuXuat(string maphieu)
        {
            PhieuXuat pd = TimPhieuXuat(maphieu);
            if (pd != null)
            {
                pd.PhietXuatStatus = "delete";
                updateDulieu();
            }
        }

        //sua phieu xuat
        public void SuaPhieuXuat(PhieuXuat pd)
        {
            PhieuXuat editpd = TimPhieuXuat(pd.PhieuXuatNo);
            if (editpd != null)
            {
                //delete luôn chi tiết phiếu
                foreach (ChiTietPhieuXuat ctpd in editpd.ChiTietPhieuXuats)
                {
                    m_ds.ChiTietPhieuXuats.DeleteOnSubmit(ctpd);
                }
                updateDulieu();

                editpd.PhieuXuatNo = pd.PhieuXuatNo;
                editpd.PhieuXuatDate = pd.PhieuXuatDate;

                //Them lai chi tiet phieu
                foreach (ChiTietPhieuXuat ctpd in pd.ChiTietPhieuXuats)
                {
                    ChiTietPhieuXuat ct = new ChiTietPhieuXuat();
                    ct.Sach = TimSachtheoId(ctpd.FK_SachID);
                    ct.PhieuXuat = TimPhieuXuat(ctpd.PhieuXuat.PhieuXuatNo);
                    ct.Quantum = ctpd.Quantum;
                    m_ds.ChiTietPhieuXuats.InsertOnSubmit(ct);
                }
                updateDulieu();
            }
        }

        //Sửa trạng thái xử lý phiếu xuất
        public void SuaTrangThaiXuLyPhieuXuat(string ma)
        {
            PhieuXuat pd = TimPhieuXuat(ma);
            if (pd != null)
            {
                pd.PhieuXuatHandle = "yes";
                updateDulieu();
            }
        }
        #endregion

        #region Các hàm xử lý của nhà cung cấp

        //lay ds nha cung cap
        public List<NhaCungCap> getdsNCC()
        {
            return m_ds.NhaCungCaps.ToList();
        }

        //Tim nha cung cap
        private NhaCungCap TimNCC(string ma)
        {
            NhaCungCap ncc = null;
            var kq = m_ds.NhaCungCaps.Where(x => x.NhaCungCapNo == ma);
            if (kq.Count() > 0)
                ncc = kq.First();
            return ncc;
        }

        //Them nha cung cap
        public void ThemNhacungcap(NhaCungCap ncc)
        {
            m_ds.NhaCungCaps.InsertOnSubmit(ncc);
            updateDulieu();
        }

        //Xoa nha cung cap
        public void XoaNhacungcap(string mancc)
        {
            NhaCungCap editncc = m_ds.NhaCungCaps.Where(x=>x.NhaCungCapNo==mancc).First();
            if (editncc != null)
            {
                editncc.Nhacungcapstatus = "delete";
                updateDulieu();
            }
        }

        //Sua nha cung cap
        public void SuaNhacungcap(NhaCungCap ncc)
        {
            NhaCungCap editncc = m_ds.NhaCungCaps.Where(x => x.NhaCungCapNo == ncc.NhaCungCapNo).First();
            if (editncc != null)
            {
                editncc.NhaCungCapName = ncc.NhaCungCapName;
                editncc.NhaCungCapAddress = ncc.NhaCungCapAddress;
                editncc.NhaCungCapPhoneNumber = ncc.NhaCungCapPhoneNumber;
                editncc.NhaCungCapEmail = ncc.NhaCungCapEmail;
                editncc.NhaCungCapDescription = ncc.NhaCungCapDescription;
                updateDulieu();
            }
        }

        //them danh muc sach
        public void ThemDanhMucSach(NhaCungCap ncc, string ma)
        {
            Sach_NhaCungCap sncc = new Sach_NhaCungCap();
            sncc.NhaCungCap = TimNCC(ncc.NhaCungCapNo);
            sncc.Sach = TimSachtheoma(ma);
            m_ds.Sach_NhaCungCaps.InsertOnSubmit(sncc);
        }

        #endregion

        #region Các hàm xử lý sách trong kho

        // Get danh sách Sách trong kho trưng bày
        public List<TonKho> getListSachTrungBay()
        {
            List<TonKho> dssachtrungbay = new List<TonKho>();
            Kho k = m_ds.Khos.Where(x => x.KhoID == 2).First();
            foreach (TonKho ton in k.TonKhos)
            {
                dssachtrungbay.Add(ton);
            }
            return dssachtrungbay;
        }

        // Get danh sách Sách trong kho
        public List<TonKho> getListSachKho()
        {
            List<TonKho> dsSachKho = new List<TonKho>();
            Kho k = m_ds.Khos.Where(x => x.KhoID == 1).First();
            foreach (TonKho ton in k.TonKhos)
            {
                dsSachKho.Add(ton);
            }
            return dsSachKho;
        }

        //Kiểm tra sách có tồn tại trong kho hay chưa (dùng chung cho cả kho và trưng bày)
        public TonKho KiemTraTonTai(int KhoID,int SachID)
        {
            TonKho tk = null;
            var kq = m_ds.TonKhos.Where(x => x.FK_KhoID == KhoID && x.FK_SachID == SachID);
            if (kq.Count()>0)
                tk = kq.First<TonKho>();
            return tk;
        }

        //Tạo Tồn kho
        public void TaoTonKho(TonKho tk)
        {
            m_ds.TonKhos.InsertOnSubmit(tk);
            updateDulieu();
        }

        //Nhập sách vào kho (dùng chung cho cả kho và trưng bày)
        public void NhapSachVaoKho(int KhoID,int SachID,int SoLuong)
        {
            TonKho edittk = KiemTraTonTai(KhoID, SachID);
            if (edittk != null)
            {
                edittk.SoLuong += SoLuong;
                updateDulieu();
            }
            else
            {
                TonKho tk = new TonKho();
                tk.FK_KhoID = KhoID;
                tk.FK_SachID = SachID;
                tk.SoLuong = SoLuong;
                TaoTonKho(tk);
            }
        }

        //Xuất khách ra kho (dùng chung cho cả kho và trưng bày)
        public void XuatSachRaKho(int KhoID, int SachID, int SoLuong)
        {
            TonKho edittk = KiemTraTonTai(KhoID, SachID);
            if (edittk != null)
            {
                edittk.SoLuong -= SoLuong;
                updateDulieu();
            }
            else
                return;
        }

        //Chuyển sách lên trưng bày
        public void ChuyenSachLenTrungBay(int SachID,int SoLuong)
        {
            //Xuất khách ra kho sách
            XuatSachRaKho(1, SachID, SoLuong);

            //Nhập sách vào trưng bày
            NhapSachVaoKho(2, SachID, SoLuong);
        }

        #endregion

        #region Các hàm xử lý hóa đơn

        // Get ds hóa đơn
        public List<HoaDon> getListHoaDon()
        {
            return m_ds.HoaDons.ToList();
        }

        // Thêm hóa đơn
        public void ThemHoaDon(HoaDon hd)
        {
            m_ds.HoaDons.InsertOnSubmit(hd);
            foreach (ChiTietHoaDon cthd in hd.ChiTietHoaDons)
            {
                TonKho tk = m_ds.TonKhos.Where(x => x.Kho.KhoID == 2 && x.Sach == cthd.Sach).First();
                tk.SoLuong = tk.SoLuong - cthd.ChiTietHoaDonQuantum;
            }
            updateDulieu();
        }

        #endregion

        #region Các hàm xử lý log in

        //Kiểm tra login
        public NhanVien KiemTraLogIn(string acc, string pass)
        {
            NhanVien nv = null;
            var kq = m_ds.NhanViens.Where(x => x.NhanVienAcc == acc && x.NhanVienPass == pass);
            if (kq.Count()==1)
            {
                nv = kq.First();
            }
            return nv;
        }

        #endregion

        #region Các hàm xử lý cấu hình phân quyền   
        //Tìm nhân viên theo id
        public NhanVien TimNhanVien(int ID)
        {
            NhanVien nv = null;
            var kq=m_ds.NhanViens.Where(x => x.NhanVienID == ID);
            if (kq.Count() > 0)
            {
                nv = kq.First();
            }
            return nv;
        }

        
        //Sửa pass
        public void SuaMatKhau(NhanVien nv)
        {
            NhanVien editnv = TimNhanVien(nv.NhanVienID);
            if (nv != null)
            {
                editnv.NhanVienPass = nv.NhanVienPass;
                updateDulieu();
            }
        }

        //Tìm nhân viên theo mã
        public NhanVien TimNhanVien(string ma)
        {
            NhanVien nv = null;
            var kq = m_ds.NhanViens.Where(x => x.NhanVienNo == ma);
            if (kq.Count() > 0)
            {
                nv = kq.First();
            }
            return nv;
        }

        //Lấy danh sách nhân viên
        public List<NhanVien> GetListNhanVien()
        {
            return m_ds.NhanViens.ToList<NhanVien>();
        }

        #region Các hàm xử lý Role
        //Lấy danh sách Role
        public List<Role> GetListRole()
        {
            return m_ds.Roles.ToList<Role>();
        }

        //Lấy danh sách phân quyền
        public List<PhanQuyen> GetListPhanQuyen()
        {
            return m_ds.PhanQuyens.ToList<PhanQuyen>();
        }

        //Lấy danh sách quyền
        public List<Quyen> GetListQuyen()
        {
            return m_ds.Quyens.ToList<Quyen>();
        }

        //Tìm role
        public Role TimRole(int id)
        {
            var kq = m_ds.Roles.Where(x => x.RoleID == id);
            if (kq.Count() > 0)
                return kq.First<Role>();
            else
                return null;
        }

        //Tìm quyền
        public Quyen TimQuyen(int id)
        {
            var kq = m_ds.Quyens.Where(x => x.QuyenID == id);
            if (kq.Count() > 0)
                return kq.First<Quyen>();
            else
                return null;
        }
        //Thêm Role
        public void ThemRole(Role r)
        {
            m_ds.Roles.InsertOnSubmit(r);
            updateDulieu();
        }

        //Xóa Role
        public void XoaRole(int id)
        {
            Role editr = TimRole(id);
            if (editr != null)
            {
                editr.RoleStatus = "delete";
                updateDulieu();
            }
        }

        //Sửa Role
        public void SuaRole(Role r)
        {
            Role editr = TimRole(r.RoleID);
            if (editr != null)
            {
                //Delete luôn phân quyền trong role
                foreach (PhanQuyen pq in editr.PhanQuyens)
                {
                    m_ds.PhanQuyens.DeleteOnSubmit(pq);
                }
                updateDulieu();

                editr.RoleName = r.RoleName;
                editr.RoleDescription = r.RoleDescription;
                editr.UserUpdate = r.UserUpdate;
                editr.DateUpdate = r.DateUpdate;

                //Thêm lại phân quyền mới trong role
                foreach (PhanQuyen pq in r.PhanQuyens)
                {
                    PhanQuyen p = new PhanQuyen();
                    p.Role = TimRole(pq.FK_RoleID);
                    p.Quyen = TimQuyen(pq.FK_QuyenID);
                }
                updateDulieu();
            }
        }
        
        #endregion

        #region Các hàm xử lý tạo tài khoản
        #endregion

        #endregion


        /// <summary>
        /// update Du Lieu
        /// </summary>
        private void updateDulieu()
        {
            m_ds.SubmitChanges();
        }
    }
}
